package com.cwnu.sw.cys.core.user.domain.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author jisam
 * @version 1.0
 * @contact "jisamchan@outlook.com"
 * @date 24/03/2025
 * @description 背包物品枚举
 */
@AllArgsConstructor
@Getter
public enum ItemEnum {
    /**
     * 改名卡
     */
    MODIFY_NAME_CARD(1L, ItemTypeEnum.MODIFY_NAME_CARD, "改名卡"),
    /**
     * 爆赞徽章
     */
    LIKE_BADGE(2L, ItemTypeEnum.BADGE, "爆赞徽章"),
    /**
     * 前十注册徽章
     */
    REG_TOP10_BADGE(3L, ItemTypeEnum.BADGE, "前十注册徽章"),
    /**
     * 前100注册徽章
     */
    REG_TOP100_BADGE(4L, ItemTypeEnum.BADGE, "前100注册徽章"),
    /**
     * 知识星球
     */
    PLANET(5L, ItemTypeEnum.BADGE, "知识星球"),
    /**
     * 代码贡献者
     */
    CONTRIBUTOR(6L, ItemTypeEnum.BADGE, "代码贡献者"),
    ;

    /**
     * 物品的唯一标识符
     */
    private final Long id;

    /**
     * 物品的类型枚举
     */
    private final ItemTypeEnum typeEnum;

    /**
     * 物品的描述信息
     */
    private final String desc;

    /**
     * 缓存所有枚举项的映射，键为物品的ID，值为对应的枚举项
     */
    private static final Map<Long, ItemEnum> CACHE;

    static {
        // 初始化缓存，将所有枚举项按照ID映射到Map中
        CACHE = Arrays.stream(ItemEnum.values()).collect(Collectors.toMap(ItemEnum::getId, Function.identity()));
    }

    /**
     * 根据物品的ID获取对应的枚举项
     * @param type 物品的ID
     * @return 对应的枚举项，如果不存在则返回null
     */
    public static ItemEnum of(Long type) {
        return CACHE.get(type);
    }
}
